home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume3 / newspaths < prev    next >
Encoding:
Internet Message Format  |  1989-02-03  |  6.9 KB

  1. Path: xanth!mcnc!gatech!ukma!husc6!necntc!ncoast!allbery
  2. From: jbuck@epimass.EPI.COM (Joe Buck)
  3. Newsgroups: comp.sources.misc
  4. Subject: v03i066: Perl program for accumulating Usenet traffic statistics
  5. Message-ID: <2250@epimass.EPI.COM>
  6. Date: 29 Jun 88 02:54:03 GMT
  7. Sender: allbery@ncoast.UUCP
  8. Reply-To: jbuck@epimass.EPI.COM (Joe Buck)
  9. Organization: Entropic Processing, Inc., Cupertino, CA
  10. Lines: 230
  11. Approved: allbery@ncoast.UUCP
  12.  
  13. Posting-number: Volume 3, Issue 66
  14. Submitted-by: "Joe Buck" <jbuck@epimass.EPI.COM>
  15. Archive-name: newspaths
  16.  
  17. #! /bin/sh
  18. # This is a shell archive, meaning:
  19. # 1. Remove everything above the #! /bin/sh line.
  20. # 2. Save the resulting text in a file.
  21. # 3. Execute the file with /bin/sh (not csh) to create the files:
  22. #    README
  23. #    newspaths
  24. #    newspaths.1
  25. #    twoway
  26. # This archive created: Tue Jun 28 19:52:10 1988
  27. export PATH; PATH=/bin:$PATH
  28. if test -f 'README'
  29. then
  30.     echo shar: will not over-write existing file "'README'"
  31. else
  32. cat << \SHAR_EOF > 'README'
  33. Here's the stuff I used to generate the map in article <2249@epimass.epi.com>.
  34. Have fun.  If only it drew the maps too -- maybe Brian Reid can attach
  35. it to something.
  36.  
  37. - Joe
  38.  
  39. SHAR_EOF
  40. fi # end of overwriting check
  41. if test -f 'newspaths'
  42. then
  43.     echo shar: will not over-write existing file "'newspaths'"
  44. else
  45. cat << \SHAR_EOF > 'newspaths'
  46. #! /usr/bin/perl
  47.  
  48. # Copyright 1988 by Joseph T. Buck, jbuck@epimass.epi.com.
  49. # You may freely use and copy this program as long as you
  50. # leave my name here.
  51.  
  52. # newspaths -- news path statistics gatherer
  53.  
  54. # This perl program scans through all the news on your spool
  55. # (using the history file to find the articles) and prints
  56. # out a sorted list of frequencies that each pair of hosts
  57. # appears in the Path: headers.  That is, it determines how,
  58. # on average, your news gets to you.
  59. #
  60. # If an argument is given, it is the name of a previous output
  61. # of this program.  The figures are read in, and host pairs
  62. # from articles newer than the input file are added in.
  63. # So that this will work, the first line of the output of the
  64. # program is of the form
  65. # Last-ID: <5679@chinet.UUCP>
  66. # (without the # sign).  It records the last Message-ID in the
  67. # history file; to add new articles, we skip in the history file
  68. # until we find it.
  69.  
  70. $skip = 0;
  71. if ($#ARGV >= 0) {
  72.     $ofile = $ARGV[0];
  73.     die "Can't open $ofile!\n" unless open (of, $ofile);
  74. # First line must contain last msgid to use.
  75.     $_ = <of>;
  76.     ($key, $last_id) = split (' ');
  77.     die "Invalid input file format!\n" if ($key ne "Last-ID:");
  78.     $skip = 1;
  79. # Read in the old file.
  80.     while (<of>) {
  81.     ($cnt, $pair) = split(' ');
  82.     $pcount{$pair} = $cnt;
  83.     }
  84. }
  85. # Let's go.
  86.  
  87. die "Can't open history file!\n" unless open (hist, "/usr/lib/news/history");
  88. die "Can't cd to news spool directory!\n" unless chdir ("/usr/spool/news");
  89.  
  90. $np = $nlocal = 0;
  91. while (<hist>) {
  92. #
  93. # $_ contains a line from the history file.  Parse it.
  94. # Skip it if the article has been cancelled or expired
  95. # If the $skip flag is true, we skip until we have the right msgid
  96. #
  97.     ($id, $date, $time, $file) = split (' ');
  98.     next if ($file eq 'cancelled' || $file eq '');
  99.     if ($skip) {
  100.     if ($id eq $last_id) { $skip = 0; }
  101.     next;
  102.     }
  103. #
  104. # format of field is like comp.sources.unix/2345 .  Get ng and filename.
  105. #
  106.     ($ng, $n) = split (/\//, $file);
  107.     $file =~ tr%.%/%;
  108. #
  109. # The following may be used to skip any local groups.  Here, we
  110. # skip group names beginning with "epi" or "su".  Change to suit taste.
  111. #
  112.     next if $ng =~ /^epi|^su/;
  113.     next unless open (art, $file);    # skip if cannot open file
  114. #
  115. # Article OK.  Get its path.
  116.     while (<art>) {
  117.         ($htype, $hvalue) = split (' ');
  118.     if ($htype eq "Path:") {
  119. # We have the path, in hvalue.
  120.         $np++;
  121.         @path = split (/!/, $hvalue);
  122. # Handle locally posted articles.
  123.         if ($#path < 2) { $nlocal++; last;}
  124. # Create and count pairs.
  125.         for ($i = 0; $i < $#path - 1; $i++) {
  126.         $pair = $path[$i] . "!" . $path[$i+1];
  127.         $pcount{$pair} += 1;
  128.         }
  129.         last;
  130.     }
  131.     }
  132. }
  133. # Make sure print message comes out before sort data.
  134. $| = 1;
  135. print "Last-ID: $id\n";
  136. $| = 0;
  137. # write the data out, sorted.  Open a pipe.
  138. die "Can't exec sort!\n" unless open (sort, "|sort -nr");
  139.  
  140. while (($pair, $n) = each (pcount)) {
  141.     printf sort ("%6d %s\n", $n, $pair);
  142. }
  143. close sort;
  144. SHAR_EOF
  145. fi # end of overwriting check
  146. if test -f 'newspaths.1'
  147. then
  148.     echo shar: will not over-write existing file "'newspaths.1'"
  149. else
  150. cat << \SHAR_EOF > 'newspaths.1'
  151. .TH NEWSPATHS 1 5/31/88
  152. .SH "NAME"
  153. newspaths \- collect host connectivity information from Usenet articles
  154. .SH "SYNOPSIS"
  155. .B newspaths
  156. [
  157. .I prev_out
  158. ]
  159. .SH "DESCRIPTION"
  160. .I Newspaths
  161. scans the history file, in
  162. .IR /usr/lib/news/history ,
  163. using it to locate Usenet articles.  For each article, the Path:
  164. header is read, and split up into its constituent host pairs.
  165. An associative array keeps track of how many times each pair of
  166. hosts appears in a Path: header.  Every article in the history file is
  167. scanned.
  168. .PP
  169. The output format consists of the last Message-ID in the history file,
  170. followed by a sorted list of host pairs and counts.  Here's a sample:
  171. .sp
  172. .nf
  173. Last-ID: <24524@oliveb.olivetti.com>
  174.  42814 epimass!pyramid
  175.  22610 pyramid!ames
  176.  12824 pyramid!decwrl
  177.   7854 ames!mailrus
  178.   5426 oliveb!ames
  179.   5391 ames!pasteur
  180.   5212 decwrl!ucbvax
  181. < lots more >
  182. .fi
  183. .PP
  184. If an input file argument is given, it should be the name of a previous
  185. output of
  186. .IR newspaths .
  187. The file and counts are read in, and the history file is scanned until
  188. the Last-ID is found.  Normal processing begins with the next
  189. article given in the history file.  The idea is to be able to continue
  190. to accumulate the counts over long periods of time (despite
  191. .I expire
  192. runs) and to count each article only once.  It is an error if the
  193. given Message-ID is not found in the history file.
  194. .SH "SUGGESTED USE"
  195. Every night, from
  196. .IR cron ,
  197. do
  198. .nf
  199.     newspaths old-output > new-output
  200.     mv new-output old-output
  201. .fi
  202. .sp
  203. After 1 month of operation at
  204. .I epimass ,
  205. the resulting output is 135K bytes long.
  206. .SH AUTHOR
  207. Joseph T. Buck, jbuck@epimass.epi.com
  208. SHAR_EOF
  209. fi # end of overwriting check
  210. if test -f 'twoway'
  211. then
  212.     echo shar: will not over-write existing file "'twoway'"
  213. else
  214. cat << \SHAR_EOF > 'twoway'
  215. #! /usr/bin/perl
  216. #
  217. # twoway -- convert unidirectional counts from "newspaths" into two-way counts
  218. # Usage: twoway file
  219. # where file is an output from "newspaths".
  220.  
  221. $_ = <>;    # Skip the Last-ID: line
  222. while (<>) {
  223.     ($n, $pair) = split (' ');
  224.     ($a, $b) = split (/!/, $pair);
  225.     if ($a gt $b) { $pair = $b . "!" . $a; }    # alphabetical order
  226.     $count{$pair} += $n;
  227. }
  228. die "Can't exec sort!\n" unless open (sort, "|sort -nr");
  229. while (($pair, $n) = each (count)) {
  230.     printf sort ("%5d %s\n", $n, $pair);
  231. }
  232. close sort;
  233. SHAR_EOF
  234. chmod +x 'twoway'
  235. fi # end of overwriting check
  236. #    End of shell archive
  237. exit 0
  238. -- 
  239. - Joe Buck  {uunet,ucbvax,pyramid,<smart-site>}!epimass.epi.com!jbuck
  240. jbuck@epimass.epi.com    Old Arpa mailers: jbuck%epimass.epi.com@uunet.uu.net
  241.     If you leave your fate in the hands of the gods, don't be 
  242.     surprised if they have a few grins at your expense.    - Tom Robbins
  243.